﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace PetSystem
{
    class BancoDeDados
    {
        public static OleDbConnection Conexao()
        {
            return new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=AppBancoDatabase.mdb;Mode=ReadWrite|Share Deny None;Persist Security Info=False");
        }
    }
    class Clientes
    {
        public int Codigo { get; set; }
        public int? Codigo_pet { get; set; } //A interrogação permite que o valor seja nulo
        public int? Codigo_plano { get; set; } //A interrogação permite que o valor seja nulo
        public string Nome { get; set; }
        public DateTime Data_nascimento { get; set; }
        public string CPF { get; set; }
        public string Bairro { get; set; }
        public string Rua { get; set; }
        public string Numero { get; set; }
        public string complementos { get; set; }
        public string Email { get; set; }
        public string Sexo { get; set; }

        internal static void AtualizaListaDeClientes()
        {
            if (Application.OpenForms.OfType<frmListaItens>().Count() > 0)//Verifica se a lista de planos está aberta
            {
                foreach (var formulario in Application.OpenForms.OfType<frmListaItens>().ToList())//É como um for que é executado dentro de uma coleção de itens do mesmo tipo que vai do primeiro item até o fim dele (seja o tamanho que for)
                {
                    if (formulario.Text.Contains("Clientes"))
                    {
                        formulario.atualizaListaDeClientes();
                    }
                }
            }
        }
    }

    class Animais
    {
        public int Codigo { get; set; }
        public string Nome { get; set; }
        public DateTime Data_nascimento { get; set; }
        public string Sexo { get; set; }
        public string Raca { get; set; }
        public string corPredominante { get; set; }
        internal static void AtualizaListaDeAnimais()
        {
            if (Application.OpenForms.OfType<frmListaItens>().Count() > 0)//Verifica se a lista de planos está aberta
            {
                foreach (var formulario in Application.OpenForms.OfType<frmListaItens>().ToList())//É como um for que é executado dentro de uma coleção de itens do mesmo tipo que vai do primeiro item até o fim dele (seja o tamanho que for)
                {
                    if (formulario.Text.Contains("Animais"))
                    {
                        formulario.atualizaListaDeAnimais();
                    }
                }
            }
        }
    }

    class Planos
    {
        public int codigo { get; set; }
        public string Nome { get; set; }
        public string Descricao { get; set; }

        internal static void AtualizaListaDePlanos()
        {
            if (Application.OpenForms.OfType<frmListaItens>().Count() > 0)//Verifica se a lista de planos está aberta
            {
                foreach (var formulario in Application.OpenForms.OfType<frmListaItens>().ToList())//É como um for que é executado dentro de uma coleção de itens do mesmo tipo que vai do primeiro item até o fim dele (seja o tamanho que for)
                {
                    if (formulario.Text.Contains("Planos"))
                    {
                        formulario.atualizaListaDePlanos();
                    }
                }
            }
        }
    }

    class DAO
    {
        #region Planos
        public void IncluirPlano(Planos plano)
        {
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = BancoDeDados.Conexao();
            comando.Connection.Open();
            comando.CommandText = "INSERT INTO Planos (nome,descricao) VALUES ('" + plano.Nome + "','" + plano.Descricao + "')";
            comando.ExecuteNonQuery();
            comando.Connection.Close();
        }
        public void ExcluirPlano(String codigo)
        {
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = BancoDeDados.Conexao();
            comando.CommandText = "DELETE FROM Planos Where codigo = " + codigo;
            comando.Connection.Open();
            comando.ExecuteNonQuery();
            comando.Connection.Close();
        }
        public void AtualizaPlano(Planos plano)
        {
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = BancoDeDados.Conexao();
            comando.CommandText = "UPDATE Planos set nome='" + plano.Nome + "', descricao ='" + plano.Descricao + "' Where codigo = " + plano.codigo;
            comando.Connection.Open();
            comando.ExecuteNonQuery();
            comando.Connection.Close();
        }
        public DataTable listaPlanos()
        {
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = BancoDeDados.Conexao();
            comando.CommandText = "Select codigo as Codigo,nome as Nome from Planos";
            comando.Connection.Open();
            OleDbDataAdapter leitor = new OleDbDataAdapter(comando);
            DataTable dtPlanos = new DataTable();
            leitor.Fill(dtPlanos);
            comando.Connection.Close();
            return dtPlanos;
        }
        public Planos ObterPlano(String codigo)
        {
            OleDbCommand comando = new OleDbCommand();
            OleDbDataReader dr;
            comando.Connection = BancoDeDados.Conexao();
            comando.Connection.Open();
            comando.CommandText = "SELECT * FROM Planos where codigo = " + codigo;
            dr = comando.ExecuteReader();
            Planos plano = new Planos();
            while (dr.Read())
            {
                plano.codigo = int.Parse(dr["codigo"].ToString());
                plano.Nome = dr["nome"].ToString();
                plano.Descricao = dr["descricao"].ToString();
            }
            comando.Connection.Close();
            return plano;
        }
        public int UltimoPlanoCadastrado()
        {
            OleDbCommand comando = new OleDbCommand();
            OleDbDataReader dr;
            comando.Connection = BancoDeDados.Conexao();
            comando.Connection.Open();
            comando.CommandText = "SELECT top 1 codigo FROM Planos order by 1 desc";
            dr = comando.ExecuteReader();
            int Codigo = 0;
            while (dr.Read())
            {
                try { Codigo = int.Parse(dr["codigo"].ToString()); }
                catch { }
            }
            comando.Connection.Close();
            return Codigo;
        }
        public DataTable DropPlanos()
        {
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = BancoDeDados.Conexao();
            comando.CommandText = "Select Codigo,nome from Planos";
            comando.Connection.Open();
            OleDbDataAdapter leitor = new OleDbDataAdapter(comando);
            DataTable dtPlanos = new DataTable();
            leitor.Fill(dtPlanos);
            comando.Connection.Close();
            return dtPlanos;
        }

        #endregion

        #region Clientes
        public void IncluirCliente(Clientes cliente)
        {
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = BancoDeDados.Conexao();
            comando.Connection.Open();
            string codPet_codPlano = "";
            if (cliente.Codigo_pet != null)
            {
                codPet_codPlano = cliente.Codigo_pet.ToString();
            }
            else
            {
                codPet_codPlano = "null";
            }
            if (cliente.Codigo_plano != null)
            {
                codPet_codPlano += "," + cliente.Codigo_plano.ToString();
            }
            else
            {
                codPet_codPlano += ",null";
            }
            comando.CommandText = "INSERT INTO Clientes (Codigo_pet,Codigo_plano,Nome,Data_nascimento,CPF,Bairro,Rua,Numero,Complementos,Email,Sexo) VALUES (" + codPet_codPlano + ",'" + cliente.Nome + "', '" + cliente.Data_nascimento + "', '" + cliente.CPF + "', '" + cliente.Bairro + "', '" + cliente.Rua + "', '" + cliente.Numero + "', '" + cliente.complementos + "', '" + cliente.Email + "','" + cliente.Sexo + "')";
            comando.ExecuteNonQuery();
            comando.Connection.Close();
        }
        public void ExcluirCliente(String codigo)
        {
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = BancoDeDados.Conexao();
            comando.CommandText = "DELETE FROM Clientes Where Codigo = " + codigo;
            comando.Connection.Open();
            comando.ExecuteNonQuery();
            comando.Connection.Close();
        }
        public void AtualizaCliente(Clientes cliente)
        {
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = BancoDeDados.Conexao();
            string codPet_codPlano = "";
            if (cliente.Codigo_plano != null && cliente.Codigo_pet != null)
            {
                codPet_codPlano = " Codigo_plano = " + cliente.Codigo_plano.ToString() + "," + " Codigo_pet = " + cliente.Codigo_pet.ToString() + ", ";
            }
            else
            {
                if (cliente.Codigo_plano != null)
                {
                    codPet_codPlano = " Codigo_plano = " + cliente.Codigo_plano.ToString() + ", ";
                }
                else
                {
                    codPet_codPlano = " Codigo_plano = null, ";
                }
                if (cliente.Codigo_pet != null)
                {
                    codPet_codPlano += " Codigo_pet = " + cliente.Codigo_pet.ToString() + ", ";
                }
                else
                {
                    codPet_codPlano += " Codigo_pet = null, ";
                }
            }
            comando.CommandText = "UPDATE Clientes set " + codPet_codPlano + " Nome = '" + cliente.Nome + "', Data_nascimento = '" + cliente.Data_nascimento + "', CPF = '" + cliente.CPF + "', Bairro = '" + cliente.Bairro + "', Rua = '" + cliente.Rua + "', Numero = '" + cliente.Numero + "', Complementos = '" + cliente.complementos + "', Email = '" + cliente.Email + "', Sexo = '" + cliente.Sexo + "' Where codigo = " + cliente.Codigo;
            comando.Connection.Open();
            comando.ExecuteNonQuery();
            comando.Connection.Close();
        }
        public DataTable listaClientes()
        {
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = BancoDeDados.Conexao();
            comando.CommandText = "Select codigo as Codigo,Nome,Email,Sexo,Bairro, (select nome from planos where planos.codigo = Clientes.Codigo_plano) as Plano from Clientes";
            comando.Connection.Open();
            OleDbDataAdapter leitor = new OleDbDataAdapter(comando);
            DataTable dtClientes = new DataTable();
            leitor.Fill(dtClientes);
            comando.Connection.Close();
            return dtClientes;
        }
        public Clientes ObterCliente(String codigo)
        {
            OleDbCommand comando = new OleDbCommand();
            OleDbDataReader dr;
            comando.Connection = BancoDeDados.Conexao();
            comando.Connection.Open();
            comando.CommandText = "SELECT * FROM Clientes where codigo = " + codigo;
            dr = comando.ExecuteReader();
            Clientes cliente = new Clientes();
            while (dr.Read())
            {
                cliente.Codigo = int.Parse(dr["codigo"].ToString());
                if (dr["Codigo_pet"] != DBNull.Value/*Verifica se o código salvo no banco é diferente de nulo*/) cliente.Codigo_pet = int.Parse(dr["Codigo_pet"].ToString());
                if (dr["Codigo_plano"] != DBNull.Value/*Verifica se o código salvo no banco é diferente de nulo*/) cliente.Codigo_plano = int.Parse(dr["Codigo_plano"].ToString());
                cliente.Nome = dr["nome"].ToString();
                if (dr["Data_nascimento"] != DBNull.Value) cliente.Data_nascimento = DateTime.Parse(dr["Data_nascimento"].ToString());
                cliente.CPF = dr["CPF"].ToString();
                cliente.Bairro = dr["Bairro"].ToString();
                cliente.Rua = dr["Rua"].ToString();
                cliente.Numero = dr["Numero"].ToString();
                cliente.complementos = dr["Complementos"].ToString();
                cliente.Email = dr["Email"].ToString();
                cliente.Sexo = dr["Sexo"].ToString();
            }
            comando.Connection.Close();
            return cliente;
        }
        public int UltimoClienteCadastrado()
        {
            OleDbCommand comando = new OleDbCommand();
            OleDbDataReader dr;
            comando.Connection = BancoDeDados.Conexao();
            comando.Connection.Open();
            comando.CommandText = "SELECT top 1 codigo FROM Clientes order by 1 desc";
            dr = comando.ExecuteReader();
            int Codigo = 0;
            while (dr.Read())
            {
                try { Codigo = int.Parse(dr["codigo"].ToString()); }
                catch { }
            }
            comando.Connection.Close();
            return Codigo;
        }

        #endregion

        #region Animais
        internal object listaAnimais()
        {
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = BancoDeDados.Conexao();
            comando.CommandText = "Select codigo as Codigo,nome as Nome,Raca as Raça,CorPredominante as Cor,Genero as Sexo from Animais";
            comando.Connection.Open();
            OleDbDataAdapter leitor = new OleDbDataAdapter(comando);
            DataTable dtAnimais = new DataTable();
            leitor.Fill(dtAnimais);
            comando.Connection.Close();
            return dtAnimais;
        }
        internal int UltimoAnimalCadastrado()
        {
            OleDbCommand comando = new OleDbCommand();
            OleDbDataReader dr;
            comando.Connection = BancoDeDados.Conexao();
            comando.Connection.Open();
            comando.CommandText = "SELECT top 1 codigo FROM Animais order by 1 desc";
            dr = comando.ExecuteReader();
            int Codigo = 0;
            while (dr.Read())
            {
                try { Codigo = int.Parse(dr["codigo"].ToString()); }
                catch { }
            }
            comando.Connection.Close();
            return Codigo;
        }
        internal static void IncluirAnimal(Animais animal)
        {
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = BancoDeDados.Conexao();
            comando.Connection.Open();
            comando.CommandText = "INSERT INTO Animais (nome,Raca,CorPredominante,Nascimento,Genero) VALUES ('" + animal.Nome + "','" + animal.Raca + "','" + animal.corPredominante + "','" + animal.Data_nascimento + "','" + animal.Sexo + "')";
            comando.ExecuteNonQuery();
            comando.Connection.Close();
        }

        public static void AtualizaAnimal(Animais animal)
        {
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = BancoDeDados.Conexao();
            comando.CommandText = "UPDATE Animais set nome='" + animal.Nome + "', Raca ='" + animal.Raca + "', CorPredominante = '" + animal.corPredominante + "', Nascimento = '" + animal.Data_nascimento + "', Genero = '" + animal.Sexo + "' Where codigo = " + animal.Codigo;
            comando.Connection.Open();
            comando.ExecuteNonQuery();
            comando.Connection.Close();
        }

        public Animais obterAnimal(string codigo)
        {
            OleDbCommand comando = new OleDbCommand();
            OleDbDataReader dr;
            comando.Connection = BancoDeDados.Conexao();
            comando.Connection.Open();
            comando.CommandText = "SELECT * FROM Animais where codigo = " + codigo;
            dr = comando.ExecuteReader();
            Animais animal = new Animais();
            while (dr.Read())
            {
                animal.Codigo = int.Parse(dr["codigo"].ToString());
                animal.Nome = dr["nome"].ToString();
                animal.Raca = dr["Raca"].ToString();
                animal.corPredominante = dr["CorPredominante"].ToString();
                animal.Data_nascimento = DateTime.Parse(dr["Nascimento"].ToString());
                animal.Sexo = dr["Genero"].ToString();
            }
            comando.Connection.Close();
            return animal;
        }
        public string UltimoDonoCadastrado(int CodigoAnimal)
        {
            throw new NotImplementedException();
        }
        internal static void ExcluirAnimal(string codigo)
        {
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = BancoDeDados.Conexao();
            comando.CommandText = "DELETE FROM Animais Where codigo = " + codigo;
            comando.Connection.Open();
            comando.ExecuteNonQuery();
            comando.Connection.Close();
        }
        internal object DropPets()
        {
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = BancoDeDados.Conexao();
            comando.CommandText = "Select Codigo,nome from Animais";
            comando.Connection.Open();
            OleDbDataAdapter leitor = new OleDbDataAdapter(comando);
            DataTable dtPets = new DataTable();
            leitor.Fill(dtPets);
            comando.Connection.Close();
            return dtPets;
        }

        #endregion
    }
}
